home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Micro on the Apple Volume 1 (1981)(Micro Ink)[no boot].zip / Micro on the Apple Volume 1 (1981)(Micro Ink)[no boot].do / SHAPE2.bas < prev    next >
BASIC Source File  |  1996-12-24  |  6KB  |  151 lines

  1. 10  REM  ***************************
  2. 12  REM  *                         *
  3. 14  REM  * HOW TO DO A SHAPE TABLE *
  4. 16  REM  *      JOHN FIGUERAS      *
  5. 18  REM  *                         *
  6. 20  REM  *         SHAPE2          *
  7. 21  REM  *                         *
  8. 22  REM  *   COPYRIGHT (C) 1981    *
  9. 23  REM  *     MICRO INK, INC.     *
  10. 24  REM  *  CHELMSFORD, MA 01824   *
  11. 25  REM  *   ALL RIGHTS RESERVED   *
  12. 26  REM  *                         *
  13. 27  REM  ***************************
  14. 28  REM 
  15. 30  PRINT  TAB( 6);"****CREATE A SHAPE TABLE****"
  16. 32  PRINT 
  17. 35  PRINT  TAB( 5);"J. FIGUERAS, ROCHESTER, N.Y.": PRINT 
  18. 40  PRINT  TAB( 16)"9/12/79": PRINT 
  19. 50  PRINT  TAB( 17)"****": PRINT 
  20. 60  REM  INPUT TABLE NAME AND LOCATION
  21. 70  INPUT "SHAPE TABLE NAME ";NAME$
  22. 80  INPUT "STARTING ADDRESS, DECIMAL ";ASVE
  23. 90  REM  DISK ACCESSES USE DISK D2
  24. 100 D$ =  CHR$(4): PRINT D$;"NOMON C,I,O"
  25. 110  PRINT D$;"BLOAD " +NAME$ +",A" + STR$(ASVE) +",V0,D2"
  26. 120  REM  GET CAPACITY MAX OF FILE
  27. 130 MAX =  PEEK(ASVE +2) +256 * PEEK(ASVE +3)
  28. 140 MAX = (MAX -2)/2
  29. 150  REM  GET NO. OF SHAPES IN TABLE
  30. 160 N =  PEEK(ASVE)
  31. 170  REM  GET FILE LENGTH
  32. 180 INDEX =  PEEK(ASVE +2 *N +2) +256 * PEEK(ASVE +2 *N +3)
  33. 190  REM  COMPUTE ADDRESS OF NEXT FREE BYTE
  34. 200 ADDR = ASVE +INDEX
  35. 210  REM  SEE IF FILE IS FULL
  36. 220  IF MAX >N  THEN 260
  37. 230  PRINT "SHAPE TABLE FULL. NEXT FREE BYTE AT ";ADDR
  38. 240  GOTO 1370
  39. 250  REM  SET UP ADDRESS POINTERS TO TABLE
  40. 260  POKE 232,ASVE -256 * INT(ASVE/256): POKE 233, INT(ASVE/256)
  41. 270  REM  UPDATE SHAPE COUNTER
  42. 280 N = N +1: POKE ASVE,N
  43. 290  REM  DISPLAY PLOTTING GRID. INITIALIZE COUNTER, CYCLE
  44. 300  HCOLOR= 3: SCALE= 1: ROT= 0:CYCYLE = 0
  45. 310  HGR 
  46. 320  FOR X = 0 TO 150  STEP 10: HPLOT X,0 TO X,150: NEXT 
  47. 330  FOR Y = 0 TO 150  STEP 10: HPLOT 0,Y TO 150,Y: NEXT 
  48. 340  REM  CLEAR TEXT AND GET INITIAL PLOT COORDS
  49. 350  PRINT : PRINT : PRINT : PRINT 
  50. 360  PRINT "ENTER STARTING COORDS"
  51. 370  INPUT "X ";X:X = 10 *X -5
  52. 380  INPUT "Y ";Y:Y = 10 *Y -5
  53. 390  DRAW 1 AT X,Y:XS = X:YS = Y
  54. 400  REM  CLEAR TEXT. DISPLAY INSTRUCTIONS
  55. 410  PRINT : PRINT : PRINT : PRINT 
  56. 420  PRINT "MOVE PLOT CURSOR WITH KEYS"
  57. 430  PRINT "L-LEFT  R-RIGHT  U-UP  D-DOWN"
  58. 440  PRINT "P TO PLOT     Q TO QUIT"
  59. 450  REM  INITIALIZE KEY$. PLOT CURSOR
  60. 460 KEY$ = "":KSVE$ = "": GOTO 570
  61. 470  REM  FLAG RE-ENABLES CURSOR AFTER A PLOT DISABLE
  62. 480  IF FLAG = 1  THEN 520
  63. 490  REM  ERASE CURSOR IN PREVIOUS SQUARE
  64. 500  XDRAW 1 AT X1,Y1
  65. 510  REM  PLOT CURSOR AT NEW X,Y.  SAVE X,Y
  66. 520 X1 = X:Y1 = Y:FLAG = 0
  67. 530  XDRAW 1 AT X,Y
  68. 540  REM  SAVE LAST TWO KEYSTROKES.  KI$ IS NEEDED FOR ERASE R OUTLINE
  69. 550 KI$ = KSVE$:KSVE$ = KEY$
  70. 560  REM  GET NEW KEYSTROKE
  71. 570  GET KEY$
  72. 580  REM    GO TO SIEVE TO GET 3-BIT PLOT VECTOR FROM KEY$ AND KSVE$
  73. 590  IF KEY$ < >"U"  THEN 610
  74. 600 SYMBOL = 0:Y = Y -10: GOTO 760
  75. 610  IF KEY$ < >"R"  THEN 630
  76. 620 SYMBOL = 1:X = X +10: GOTO 760
  77. 630  IF KEY$ < >"D"  THEN 650
  78. 640 SYMBOL = 2:Y = Y +10: GOTO 760
  79. 650  IF KEY$ < >"L"  THEN 670
  80. 660 SYMBOL = 3:X = X -10: GOTO 760
  81. 670  IF KEY$ < >"P"  THEN 690
  82. 680 FLAG = 1: GOSUB 1000: GOTO 530
  83. 690  IF KEY$ = "Q"  THEN 1080
  84. 700  REM  NEXT STATEMENT PROTECTS FROM KEYING ERROR
  85. 710  IF KEY$ < >"E"  THEN 570
  86. 720  HCOLOR= 0:FLAG = 0: GOSUB 1000
  87. 730  REM  SET UP PRE-PLOT STATUS
  88. 740 KSVE$ = KI$: HCOLOR= 3: GOTO 500
  89. 750  REM  ADJUST 3-BIT VECTOR FOR PLOT
  90. 760  IF KSVE$ = "P"  THEN SYMBOL = SYMBOL +4
  91. 770  REM  LOAD 3-BIT VECTOR INTO BYTE
  92. 780 CYCLE = CYCLE +1
  93. 790  IF CYCLE < >1  THEN 810
  94. 800 BYTE = SYMBOL: GOTO 480
  95. 810  IF CYCLE < >2  THEN 900
  96. 820 BYTE = BYTE +8 *SYMBOL
  97. 830  REM  PROTECT AGAINST PREMATURE END-OF-RECORD
  98. 840  IF BYTE >7  THEN 480
  99. 850  REM  ENTER DUMMY RIGHT MOVE AND STORE BYTE
  100. 860 BYTE = BYTE +8: POKE ADDR,BYTE:ADDR = ADDR +1
  101. 870  REM  ENTER UP MOVE AND DUMMY LEFT MOVE IN NEW BYTE
  102. 880 BYTE = 24:CYCLE = 2: GOTO 480
  103. 890  REM  ID THIRD 3-BIT VECTOR IS A MOVE ONLY, FINISH BYTE; ELSE LOAD BYTE INTO TABLE AND STORE 3-BIT VECTOR IN NEXT BYTE.
  104. 900  IF SYMBOL >3  THEN 930
  105. 910 BYTE = BYTE +64 *SYMBOL
  106. 920  REM  STORE BYTE
  107. 930  POKE ADDR,BYTE:ADDR = ADDR +1
  108. 940  REM  STORE 3-BIT VECTOR IN NEXT BYTE IF NEEDED
  109. 950  IF SYMBOL = 0  OR SYMBOL >3  THEN 980
  110. 960  REM  PREPARE FOR NEXT BYTE.  GET NEXT 3-BIT VECTOR
  111. 970 CYCLE = 0: GOTO 480
  112. 980 CYCLE = 1:BYTE = SYMBOL: GOTO 480
  113. 990  REM  PLOT ROUTINE
  114. 1000  FOR Y2 = Y -3 TO Y +3  STEP 6: HPLOT X -1,Y2 TO X +1,Y2: NEXT 
  115. 1010  FOR Y2 = Y -2 TO Y +2  STEP 4: HPLOT X -2,Y2 TO X +2,Y2: NEXT 
  116. 1020  FOR Y2 = Y -1 TO Y +1: HPLOT X -3,Y2 TO X +3,Y2: NEXT 
  117. 1030  REM   TURN OFF CURSOR IN PLOTTED SQ.
  118. 1040  IF X = XS  AND Y = YS  THEN  RETURN 
  119. 1050  XDRAW 1 AT X,Y: RETURN 
  120. 1060  REM   PREPARE BYTE FOR QUIT
  121. 1070  REM  CLOSE OUT BYTE FOR MOVE-ONLY
  122. 1080  IF KSVE$ < >"P"  THEN 1150
  123. 1090  REM   USE PLOT-THEN-UP VECTOR TO END
  124. 1100  IF CYCLE < >2  THEN 1120
  125. 1110  POKE ADDR,BYTE:ADDR = ADDR +1
  126. 1120  IF CYCLE < >1  THEN 1140
  127. 1130 BYTE = BYTE +32: GOTO 1150
  128. 1140 BYTE = 4
  129. 1150  POKE ADDR,BYTE:ADDR = ADDR +1
  130. 1160  REM   ADD RECORD MARK.  DISPLAY NEW SHAPE
  131. 1170  POKE ADDR,0:ADDR = ADDR +1: XDRAW N AT 200,75
  132. 1180  INPUT "SAVE SHAPE? Y/N ";KI$
  133. 1190  IF KI$ = "Y"  THEN 1220
  134. 1200 N = N -1: GOTO 180
  135. 1210  REM  GET INDEX FOR NEXT FREE BYTE
  136. 1220 N = N +1:ADDR = ADDR -ASVE
  137. 1230  IF N <MAX  THEN 1270
  138. 1240  PRINT "WARNING: TABLE FULL WITH THIS SHAPE"
  139. 1250  IF N >MAX  THEN 1310
  140. 1260  REM  STORE INDEX IN DIRECTORY
  141. 1270  POKE ASVE +2 *N,ADDR -256 * INT(ADDR/256)
  142. 1280  POKE ASVE +2 *N +1, INT(ADDR/256)
  143. 1290  INPUT "DONE? Y/N ";KI$
  144. 1300  IF KI$ = "N"  THEN 160
  145. 1310  INPUT "SAVE TABLE?  Y/N ";KI$
  146. 1320  REM   RESPONSE PROTECTED AGAINST RANDOM KEY HIT
  147. 1330  IF KI$ = "Y"  THEN 1360
  148. 1340  IF KI$ = "N"  THEN 1370
  149. 1350  GOTO 1310
  150. 1360  PRINT D$;"BSAVE" +NAME$ +",A" + STR$(ASVE) +",L" + STR$(ADDR)
  151. 1370  END